home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume7 / nethack3 / patch7v < prev    next >
Encoding:
Internet Message Format  |  1990-02-26  |  60.4 KB

  1. Path: uunet!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v09i022:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch7v
  5. Message-ID: <5236@tekred.CNA.TEK.COM>
  6. Date: 24 Feb 90 01:05:43 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 2310
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 9, Issue 22
  13. Archive-name: NetHack3/Patch7v
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 22 (of 30)."
  25. # Contents:  include/mondata.h patch7.18
  26. # Wrapped by billr@saab on Wed Feb 21 10:04:43 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'include/mondata.h' -a "${1}" != "-c" ; then 
  29.   echo shar: Renaming existing file \"'include/mondata.h'\" to \"'include/mondata.h.orig'\"
  30.   mv -f 'include/mondata.h' 'include/mondata.h.orig'
  31. fi
  32. echo shar: Extracting \"'include/mondata.h'\" \(4813 characters\)
  33. sed "s/^X//" >'include/mondata.h' <<'END_OF_FILE'
  34. X/*    SCCS Id: @(#)mondata.h    3.0    89/11/21
  35. X/* NetHack may be freely redistributed.  See license for details. */
  36. X/* Copyright (c) 1989 Mike Threepoint */
  37. X
  38. X#ifndef MONDATA_H
  39. X#define MONDATA_H
  40. X
  41. X# ifndef STUPID_CPP    /* otherwise these macros are functions in mondata.c */
  42. X
  43. X#define verysmall(ptr)        ((ptr)->msize < MZ_SMALL)
  44. X#define bigmonst(ptr)        ((ptr)->msize >= MZ_LARGE)
  45. X
  46. X#define is_flyer(ptr)        (((ptr)->mflags1 & M1_FLY) != 0L)
  47. X#define is_floater(ptr)     ((ptr)->mlet == S_EYE)
  48. X#define is_swimmer(ptr)     (((ptr)->mflags1 & M1_SWIM) != 0L)
  49. X#define passes_walls(ptr)    (((ptr)->mflags1 & M1_WALLWALK) != 0L)
  50. X#define amorphous(ptr)        (((ptr)->mflags1 & M1_AMORPHOUS) != 0L)
  51. X#define noncorporeal(ptr)    ((ptr)->mlet == S_GHOST)
  52. X#define tunnels(ptr)        (((ptr)->mflags1 & M1_TUNNEL) != 0L)
  53. X#define needspick(ptr)        (((ptr)->mflags1 & M1_NEEDPICK) != 0L)
  54. X#define hides_under(ptr)    (((ptr)->mflags1 & M1_CONCEAL) != 0L)
  55. X#define is_hider(ptr)        (((ptr)->mflags1 & M1_HIDE) != 0L)
  56. X#define haseyes(ptr)        (((ptr)->mflags1 & M1_NOEYES) == 0L)
  57. X#define nohands(ptr)        (((ptr)->mflags1 & M1_NOHANDS) != 0L)
  58. X#define nolimbs(ptr)        (((ptr)->mflags1 & M1_NOLIMBS) == M1_NOLIMBS)
  59. X#  ifdef POLYSELF
  60. X#define polyok(ptr)        (((ptr)->mflags1 & M1_NOPOLY) == 0L)
  61. X#  endif
  62. X#define is_whirly(ptr)        ((ptr)->mlet == S_VORTEX || (ptr) == &mons[PM_AIR_ELEMENTAL])
  63. X#define humanoid(ptr)        (((ptr)->mflags1 & M1_HUMANOID) != 0L)
  64. X#define is_animal(ptr)        (((ptr)->mflags1 & M1_ANIMAL) != 0L)
  65. X#define slithy(ptr)        (((ptr)->mflags1 & M1_SLITHY) != 0L)
  66. X#define thick_skinned(ptr)    (((ptr)->mflags1 & M1_THICK_HIDE) != 0L)
  67. X#define resists_fire(ptr)    (((ptr)->mflags1 & M1_FIRE_RES) != 0L)
  68. X#define resists_cold(ptr)    (((ptr)->mflags1 & M1_COLD_RES) != 0L)
  69. X#define resists_disint(ptr)    ((ptr) == &mons[PM_BLACK_DRAGON] || (ptr) == &mons[PM_BABY_BLACK_DRAGON])
  70. X#define resists_elec(ptr)    (((ptr)->mflags1 & M1_ELEC_RES) != 0L)
  71. X#define resists_acid(ptr)    (((ptr)->mflags1 & M1_ACID) != 0L)
  72. X#define acidic(ptr)        (((ptr)->mflags1 & M1_ACID) != 0L)
  73. X#define resists_poison(ptr)    (((ptr)->mflags1 & (M1_POIS | M1_POIS_RES)) != 0L)
  74. X#define poisonous(ptr)        (((ptr)->mflags1 & M1_POIS) != 0L)
  75. X#define regenerates(ptr)    (((ptr)->mflags1 & M1_REGEN) != 0L)
  76. X#define perceives(ptr)        (((ptr)->mflags1 & M1_SEE_INVIS) != 0L)
  77. X#define can_teleport(ptr)    (((ptr)->mflags1 & M1_TPORT) != 0L)
  78. X#define control_teleport(ptr)    (((ptr)->mflags1 & M1_TPORT_CONTROL) != 0L)
  79. X#define is_armed(ptr)        attacktype(ptr, AT_WEAP)
  80. X#define likes_gold(ptr)     (((ptr)->mflags1 & M1_GREEDY) != 0L)
  81. X#define likes_gems(ptr)     (((ptr)->mflags1 & M1_JEWELS) != 0L)
  82. X#define likes_objs(ptr)     (((ptr)->mflags1 & M1_COLLECT) != 0L || \
  83. X                    is_armed(ptr))
  84. X#define likes_magic(ptr)    (((ptr)->mflags1 & M1_MAGIC) != 0L)
  85. X#define is_undead(ptr)        (((ptr)->mflags2 & M2_UNDEAD) != 0L)
  86. X#define resists_sleep(ptr)    (((ptr)->mflags1 & M1_SLEE_RES) != 0L || is_undead(ptr))
  87. X#define is_were(ptr)        (((ptr)->mflags2 & M2_WERE) != 0L)
  88. X#define is_elf(ptr)        (((ptr)->mflags2 & M2_ELF) != 0L)
  89. X#define is_dwarf(ptr)        (((ptr)->mflags2 & M2_DWARF) != 0L)
  90. X#define is_giant(ptr)        (((ptr)->mflags2 & M2_GIANT) != 0L)
  91. X#  ifdef GOLEMS
  92. X#define is_golem(ptr)        ((ptr)->mlet == S_GOLEM)
  93. X#  endif
  94. X#define is_domestic(ptr)    (((ptr)->mflags2 & M2_DOMESTIC) != 0L)
  95. X#define is_orc(ptr)        (((ptr)->mflags2 & M2_ORC) != 0L)
  96. X#define is_human(ptr)        (((ptr)->mflags2 & M2_HUMAN) != 0L)
  97. X#define is_demon(ptr)        (((ptr)->mflags2 & M2_DEMON) != 0L)
  98. X#define is_mercenary(ptr)    (((ptr)->mflags2 & M2_MERC) != 0L)
  99. X#define is_wanderer(ptr)    (((ptr)->mflags2 & M2_WANDER) != 0L)
  100. X#define always_hostile(ptr)    (((ptr)->mflags2 & M2_HOSTILE) != 0L)
  101. X#define always_peaceful(ptr)    (((ptr)->mflags2 & M2_PEACEFUL) != 0L)
  102. X#define extra_nasty(ptr)    (((ptr)->mflags2 & M2_NASTY) != 0L)
  103. X#define strongmonst(ptr)    (((ptr)->mflags2 & M2_STRONG) != 0L)
  104. X#  ifdef POLYSELF
  105. X#define can_breathe(ptr)    attacktype(ptr, AT_BREA)
  106. X#define cantwield(ptr)        (nohands(ptr) || verysmall(ptr))
  107. X#define cantweararm(ptr)    (breakarm(ptr) || sliparm(ptr))
  108. X#  endif /* POLYSELF */
  109. X#define carnivorous(ptr)    (((ptr)->mflags2 & M2_CARNIVORE) != 0L)
  110. X#define herbivorous(ptr)    (((ptr)->mflags2 & M2_HERBIVORE) != 0L)
  111. X#define metallivorous(ptr)    (((ptr)->mflags2 & M2_METALLIVORE) != 0L)
  112. X#define lays_eggs(ptr)        (((ptr)->mflags2 & M2_EGGS) != 0L)
  113. X#define throws_rocks(ptr)    (((ptr)->mflags2 & M2_ROCKTHROW) != 0L)
  114. X#define type_is_pname(ptr)    (((ptr)->mflags2 & M2_PNAME) != 0L)
  115. X#define is_lord(ptr)        (((ptr)->mflags2 & M2_LORD) != 0L)
  116. X#define is_prince(ptr)        (((ptr)->mflags2 & M2_PRINCE) != 0L)
  117. X#  ifdef INFERNO
  118. X#define is_ndemon(ptr)        (is_demon(ptr) && \
  119. X            (((ptr)->mflags2 & (M2_LORD | M2_PRINCE)) == 0L))
  120. X#  else
  121. X#define is_ndemon(ptr)        (ptr == &mons[PM_DEMON])
  122. X#  endif
  123. X#define is_dlord(ptr)        (is_demon(ptr) && is_lord(ptr))
  124. X#define is_dprince(ptr)        (is_demon(ptr) && is_prince(ptr))
  125. X
  126. X# endif /* STUPID_CPP */
  127. X
  128. X#endif /* MONDATA_H */
  129. END_OF_FILE
  130. if test 4813 -ne `wc -c <'include/mondata.h'`; then
  131.     echo shar: \"'include/mondata.h'\" unpacked with wrong size!
  132. fi
  133. # end of 'include/mondata.h'
  134. if test -f 'patch7.18' -a "${1}" != "-c" ; then 
  135.   echo shar: Renaming existing file \"'patch7.18'\" to \"'patch7.18.orig'\"
  136.   mv -f 'patch7.18' 'patch7.18.orig'
  137. fi
  138. echo shar: Extracting \"'patch7.18'\" \(52317 characters\)
  139. sed "s/^X//" >'patch7.18' <<'END_OF_FILE'
  140. X*** src/Old/mthrowu.c    Mon Feb 19 20:37:10 1990
  141. X--- src/mthrowu.c    Wed Feb 14 18:38:25 1990
  142. X***************
  143. X*** 1,18 ****
  144. X! /*    SCCS Id: @(#)mthrowu.c    3.0    88/04/13
  145. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  146. X  /* NetHack may be freely redistributed.  See license for details. */
  147. X  
  148. X  #include    "hack.h"
  149. X  
  150. X! static int movedist();
  151. X  
  152. X  #define URETREATING(x,y) (movedist(u.ux,u.uy,x,y) > movedist(u.ux0,u.uy0,x,y))
  153. X  
  154. X! boolean lined_up();
  155. X  
  156. X  schar    tbx = 0, tby = 0;    /* used for direction of throw, buzz, etc. */
  157. X  
  158. X! const char *breathwep[] = {    "fragments",
  159. X                  "fire",
  160. X                  "sleep gas",
  161. X                  "frost",
  162. X--- 1,26 ----
  163. X! /*    SCCS Id: @(#)mthrowu.c    3.0    89/11/22
  164. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  165. X  /* NetHack may be freely redistributed.  See license for details. */
  166. X  
  167. X  #include    "hack.h"
  168. X  
  169. X! OSTATIC int FDECL(movedist,(int,int,int,int));
  170. X! static void FDECL(drop_throw,(struct obj *,BOOLEAN_P,int,int));
  171. X! OSTATIC void FDECL(m_throw,(int,int,int,int,int,struct obj *));
  172. X  
  173. X  #define URETREATING(x,y) (movedist(u.ux,u.uy,x,y) > movedist(u.ux0,u.uy0,x,y))
  174. X  
  175. X! boolean FDECL(lined_up, (struct monst *));
  176. X  
  177. X+ #ifndef OVLB
  178. X+ 
  179. X+ OSTATIC const char *breathwep[];
  180. X+ 
  181. X+ #else /* OVLB */
  182. X+ 
  183. X  schar    tbx = 0, tby = 0;    /* used for direction of throw, buzz, etc. */
  184. X  
  185. X! XSTATIC const char *breathwep[] = {    "fragments",
  186. X                  "fire",
  187. X                  "sleep gas",
  188. X                  "frost",
  189. X***************
  190. X*** 26,43 ****
  191. X  thitu(tlev, dam, obj, name)    /* u is hit by sth, but not a monster */
  192. X      register int tlev, dam;
  193. X      struct obj *obj;
  194. X!     register char *name;
  195. X  {
  196. X!     char *oname = an(name);
  197. X!     boolean acidic = (obj && obj->otyp == ACID_VENOM);
  198. X  
  199. X      if(u.uac + tlev <= rnd(20)) {
  200. X          if(Blind || !flags.verbose) pline("It misses.");
  201. X!         else You("are almost hit by %s!", oname);
  202. X          return(0);
  203. X      } else {
  204. X          if(Blind || !flags.verbose) You("are hit!");
  205. X!         else You("are hit by %s!", oname);
  206. X  #ifdef POLYSELF
  207. X          if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 ||
  208. X                  is_demon(uasmon) || u.usym == S_VAMPIRE ||
  209. X--- 34,51 ----
  210. X  thitu(tlev, dam, obj, name)    /* u is hit by sth, but not a monster */
  211. X      register int tlev, dam;
  212. X      struct obj *obj;
  213. X!     register const char *name;
  214. X  {
  215. X!     const char *onm = an(name);
  216. X!     boolean is_acid = (obj && obj->otyp == ACID_VENOM);
  217. X  
  218. X      if(u.uac + tlev <= rnd(20)) {
  219. X          if(Blind || !flags.verbose) pline("It misses.");
  220. X!         else You("are almost hit by %s!", onm);
  221. X          return(0);
  222. X      } else {
  223. X          if(Blind || !flags.verbose) You("are hit!");
  224. X!         else You("are hit by %s!", onm);
  225. X  #ifdef POLYSELF
  226. X          if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 ||
  227. X                  is_demon(uasmon) || u.usym == S_VAMPIRE ||
  228. X***************
  229. X*** 46,57 ****
  230. X              pline("The %sarrow sears your flesh!",
  231. X                  Blind ? "" : "silver ");
  232. X          }
  233. X!         if (acidic && resists_acid(uasmon))
  234. X              pline("It doesn't seem to hurt you.");
  235. X          else {
  236. X  #endif
  237. X!             if (acidic) pline("It burns!");
  238. X!             losehp(dam, name);
  239. X  #ifdef POLYSELF
  240. X          }
  241. X  #endif
  242. X--- 54,65 ----
  243. X              pline("The %sarrow sears your flesh!",
  244. X                  Blind ? "" : "silver ");
  245. X          }
  246. X!         if (is_acid && resists_acid(uasmon))
  247. X              pline("It doesn't seem to hurt you.");
  248. X          else {
  249. X  #endif
  250. X!             if (is_acid) pline("It burns!");
  251. X!             losehp(dam, name, KILLED_BY_AN);
  252. X  #ifdef POLYSELF
  253. X          }
  254. X  #endif
  255. X***************
  256. X*** 85,91 ****
  257. X      } else free((genericptr_t)obj);
  258. X  }
  259. X  
  260. X! static void
  261. X  m_throw(x, y, dx, dy, range, obj)
  262. X      register int x,y,dx,dy,range;        /* direction and range */
  263. X      register struct obj *obj;
  264. X--- 93,99 ----
  265. X      } else free((genericptr_t)obj);
  266. X  }
  267. X  
  268. X! XSTATIC void
  269. X  m_throw(x, y, dx, dy, range, obj)
  270. X      register int x,y,dx,dy,range;        /* direction and range */
  271. X      register struct obj *obj;
  272. X***************
  273. X*** 174,180 ****
  274. X              }
  275. X              mtmp->mhp -= damage;
  276. X              if(mtmp->mhp < 1) {
  277. X!                 pline("%s is killed!", vis ? Monnam(mtmp) : "It");
  278. X                  mondied(mtmp);
  279. X              }
  280. X  
  281. X--- 182,191 ----
  282. X              }
  283. X              mtmp->mhp -= damage;
  284. X              if(mtmp->mhp < 1) {
  285. X!                 pline("%s is %s!", vis ? Monnam(mtmp) : "It",
  286. X!                    (is_demon(mtmp->data) || 
  287. X!                     is_undead(mtmp->data) || !vis) ?
  288. X!                  "destroyed" : "killed");
  289. X                  mondied(mtmp);
  290. X              }
  291. X  
  292. X***************
  293. X*** 214,220 ****
  294. X              if (hitu && obj->opoisoned)
  295. X                  /* it's safe to call xname twice because it's the
  296. X                     same object both times... */
  297. X!                 poisoned(xname(singleobj), A_STR, xname(singleobj));
  298. X              if(hitu && (obj->otyp == CREAM_PIE ||
  299. X                       obj->otyp == BLINDING_VENOM)) {
  300. X                  blindinc = rnd(25);
  301. X--- 225,231 ----
  302. X              if (hitu && obj->opoisoned)
  303. X                  /* it's safe to call xname twice because it's the
  304. X                     same object both times... */
  305. X!                 poisoned(xname(singleobj), A_STR, xname(singleobj), 10);
  306. X              if(hitu && (obj->otyp == CREAM_PIE ||
  307. X                       obj->otyp == BLINDING_VENOM)) {
  308. X                  blindinc = rnd(25);
  309. X***************
  310. X*** 228,233 ****
  311. X--- 239,245 ----
  312. X                      makeplural(body_part(EYE)));
  313. X                  }
  314. X              }
  315. X+             stop_occupation();
  316. X              if (hitu || !range) {
  317. X                  drop_throw(singleobj, hitu, u.ux, u.uy);
  318. X                  break;
  319. X***************
  320. X*** 285,290 ****
  321. X--- 297,305 ----
  322. X      }
  323. X  }
  324. X  
  325. X+ #endif /* OVLB */
  326. X+ #ifdef OVL1
  327. X+ 
  328. X  /* Always returns 0??? -SAC */
  329. X  int
  330. X  thrwmu(mtmp)    /* monster throws item at you */
  331. X***************
  332. X*** 308,314 ****
  333. X             !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy)))
  334. X          {
  335. X              int savequan = otmp->quan;
  336. X!             char *verb = "throws";
  337. X  
  338. X              if (otmp->otyp == ARROW
  339. X  #ifdef TOLKIEN
  340. X--- 323,329 ----
  341. X             !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy)))
  342. X          {
  343. X              int savequan = otmp->quan;
  344. X!             const char *verb = "throws";
  345. X  
  346. X              if (otmp->otyp == ARROW
  347. X  #ifdef TOLKIEN
  348. X***************
  349. X*** 331,339 ****
  350. X      return 0;
  351. X  }
  352. X  
  353. X  int
  354. X! spitmu(mtmp)            /* monster spits substance at you */
  355. X  register struct monst *mtmp;
  356. X  {
  357. X      register struct obj *otmp;
  358. X  
  359. X--- 346,358 ----
  360. X      return 0;
  361. X  }
  362. X  
  363. X+ #endif /* OVL1 */
  364. X+ #ifdef OVLB
  365. X+ 
  366. X  int
  367. X! spitmu(mtmp, mattk)        /* monster spits substance at you */
  368. X  register struct monst *mtmp;
  369. X+ register struct attack *mattk;
  370. X  {
  371. X      register struct obj *otmp;
  372. X  
  373. X***************
  374. X*** 344,355 ****
  375. X          return 0;
  376. X      }
  377. X      if(lined_up(mtmp)) {
  378. X!         otmp = mksobj(mtmp->data==&mons[PM_COBRA] ?
  379. X!             BLINDING_VENOM : ACID_VENOM, FALSE);
  380. X!         /* really incorrect; should check the attack type; this might
  381. X!          * fail if someone introduces another monster with a venom
  382. X!          * attack...
  383. X!          */
  384. X          if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
  385. X              if (canseemon(mtmp))
  386. X              pline("%s spits venom!", Monnam(mtmp));
  387. X--- 363,380 ----
  388. X          return 0;
  389. X      }
  390. X      if(lined_up(mtmp)) {
  391. X!         switch (mattk->adtyp) {
  392. X!             case AD_BLND:
  393. X!             case AD_DRST:
  394. X!             otmp = mksobj(BLINDING_VENOM, FALSE);
  395. X!             break;
  396. X!             default:
  397. X!             impossible("bad attack type in spitmu");
  398. X!                 /* fall through */
  399. X!             case AD_ACID:
  400. X!             otmp = mksobj(ACID_VENOM, FALSE);
  401. X!             break;
  402. X!         }
  403. X          if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
  404. X              if (canseemon(mtmp))
  405. X              pline("%s spits venom!", Monnam(mtmp));
  406. X***************
  407. X*** 362,367 ****
  408. X--- 387,395 ----
  409. X      return 0;
  410. X  }
  411. X  
  412. X+ #endif /* OVLB */
  413. X+ #ifdef OVL1
  414. X+ 
  415. X  int
  416. X  breamu(mtmp, mattk)            /* monster breathes at you (ranged) */
  417. X      register struct monst *mtmp;
  418. X***************
  419. X*** 412,421 ****
  420. X          x = bx; y = by;
  421. X          while(x != ax || y != ay) {
  422. X  
  423. X!             if (!ACCESSIBLE(levl[x][y].typ) ||
  424. X!               (IS_DOOR(levl[x][y].typ) && 
  425. X!                 (levl[x][y].doormask & (D_LOCKED | D_CLOSED)))) 
  426. X!             return FALSE;
  427. X              x += sgn(tbx), y += sgn(tby);
  428. X          }
  429. X          return TRUE;
  430. X--- 440,446 ----
  431. X          x = bx; y = by;
  432. X          while(x != ax || y != ay) {
  433. X  
  434. X!             if(!accessible(x, y)) return FALSE;
  435. X              x += sgn(tbx), y += sgn(tby);
  436. X          }
  437. X          return TRUE;
  438. X***************
  439. X*** 430,435 ****
  440. X--- 455,463 ----
  441. X      return(linedup(mtmp->mux,mtmp->muy,mtmp->mx,mtmp->my));
  442. X  }
  443. X  
  444. X+ #endif /* OVL1 */
  445. X+ #ifdef OVL0
  446. X+ 
  447. X  /* Check if a monster is carrying a particular item.
  448. X   */
  449. X  struct obj *
  450. X***************
  451. X*** 445,452 ****
  452. X      return((struct obj *) 0);
  453. X  }
  454. X  
  455. X! static int
  456. X  movedist(x0, x1, y0, y1)
  457. X  {
  458. X      register int absdx, absdy;
  459. X  
  460. X--- 473,484 ----
  461. X      return((struct obj *) 0);
  462. X  }
  463. X  
  464. X! #endif /* OVL0 */
  465. X! #ifdef OVL1
  466. X! 
  467. X! XSTATIC int
  468. X  movedist(x0, x1, y0, y1)
  469. X+ int x0, x1, y0, y1;
  470. X  {
  471. X      register int absdx, absdy;
  472. X  
  473. X***************
  474. X*** 455,457 ****
  475. X--- 487,491 ----
  476. X  
  477. X      return (max(absdx,absdy));
  478. X  }
  479. X+ 
  480. X+ #endif /* OVL1 */
  481. X*** src/Old/music.c    Mon Feb 19 20:37:41 1990
  482. X--- src/music.c    Mon Feb 19 10:18:01 1990
  483. X***************
  484. X*** 30,36 ****
  485. X--- 30,46 ----
  486. X  #include "hack.h"
  487. X  
  488. X  #ifdef MUSIC
  489. X+ #include <ctype.h>
  490. X  
  491. X+ static void FDECL(awaken_monsters,(int));
  492. X+ static void FDECL(put_monsters_to_sleep,(int));
  493. X+ static void FDECL(charm_snakes,(int));
  494. X+ static void FDECL(calm_nymphs,(int));
  495. X+ static void NDECL(awaken_soldiers);
  496. X+ static void FDECL(charm_monsters,(int));
  497. X+ static void FDECL(do_earthquake,(int));
  498. X+ static int FDECL(do_improvisation,(struct obj *));
  499. X+ 
  500. X  /*
  501. X   * Wake every monster in range...
  502. X   */
  503. X***************
  504. X*** 48,54 ****
  505. X                mtmp->mflee = 1;
  506. X          } else if (dist(mtmp->mx, mtmp->my) < distance) {
  507. X              mtmp->msleep = 0;
  508. X!             mtmp->mfroz = 0;
  509. X          }
  510. X          mtmp = mtmp->nmon;
  511. X      }
  512. X--- 58,65 ----
  513. X                mtmp->mflee = 1;
  514. X          } else if (dist(mtmp->mx, mtmp->my) < distance) {
  515. X              mtmp->msleep = 0;
  516. X!             mtmp->mcanmove = 1;
  517. X!             mtmp->mfrozen = 0;
  518. X          }
  519. X          mtmp = mtmp->nmon;
  520. X      }
  521. X***************
  522. X*** 66,73 ****
  523. X  
  524. X      while(mtmp) {
  525. X            if (dist(mtmp->mx, mtmp->my) < distance)
  526. X!             if(!mtmp->mfroz && !resist(mtmp, WAND_SYM, 0, NOTELL))
  527. X!               mtmp->mfroz = 1;
  528. X          mtmp = mtmp->nmon;
  529. X      }
  530. X  }
  531. X--- 77,84 ----
  532. X  
  533. X      while(mtmp) {
  534. X            if (dist(mtmp->mx, mtmp->my) < distance)
  535. X!             if(mtmp->mcanmove && !resist(mtmp, WAND_SYM, 0, NOTELL))
  536. X!               mtmp->mcanmove = mtmp->mfrozen = 0;
  537. X          mtmp = mtmp->nmon;
  538. X      }
  539. X  }
  540. X***************
  541. X*** 122,129 ****
  542. X      register struct monst *mtmp = fmon;
  543. X  
  544. X      while(mtmp) {
  545. X!         if (IS_SOLDIER(mtmp->data))
  546. X!             mtmp->mpeaceful = mtmp->msleep = mtmp->mfroz = 0;
  547. X          mtmp = mtmp->nmon;
  548. X      }
  549. X  #endif /* ARMY /**/
  550. X--- 133,142 ----
  551. X      register struct monst *mtmp = fmon;
  552. X  
  553. X      while(mtmp) {
  554. X!         if (IS_SOLDIER(mtmp->data)) {
  555. X!             mtmp->mpeaceful = mtmp->msleep = 0;
  556. X!             mtmp->mcanmove = 1;
  557. X!         }
  558. X          mtmp = mtmp->nmon;
  559. X      }
  560. X  #endif /* ARMY /**/
  561. X***************
  562. X*** 219,225 ****
  563. X                      int saved_conf = u.umconf;
  564. X  
  565. X                      if(!cansee(x,y))
  566. X!                         pline("It has died!");
  567. X                      else {
  568. X                          You("destroy %s!",
  569. X                          mtmp->mtame ?
  570. X--- 232,238 ----
  571. X                      int saved_conf = u.umconf;
  572. X  
  573. X                      if(!cansee(x,y))
  574. X!                         pline("It is destroyed!");
  575. X                      else {
  576. X                          You("destroy %s!",
  577. X                          mtmp->mtame ?
  578. X***************
  579. X*** 242,248 ****
  580. X                          You("fall into a chasm!");
  581. X                          u.utrap = rn1(6,2);
  582. X                          u.utraptype = TT_PIT;
  583. X!                         losehp(rnd(6),"fall into a chasm");
  584. X                          selftouch("Falling, you");
  585. X                      }
  586. X                  } else
  587. X--- 255,262 ----
  588. X                          You("fall into a chasm!");
  589. X                          u.utrap = rn1(6,2);
  590. X                          u.utraptype = TT_PIT;
  591. X!                         losehp(rnd(6),"fell into a chasm",
  592. X!                         NO_KILLER_PREFIX);
  593. X                          selftouch("Falling, you");
  594. X                      }
  595. X                  } else
  596. X***************
  597. X*** 302,308 ****
  598. X              } else {
  599. X                  if (!u.dx && !u.dy && !u.dz) {
  600. X                      if((damage = zapyourself(instr)))
  601. X!                       losehp(damage,"self-inflicted injury");
  602. X                      makeknown(instr->otyp);
  603. X                      return(2);
  604. X                  }
  605. X--- 316,324 ----
  606. X              } else {
  607. X                  if (!u.dx && !u.dy && !u.dz) {
  608. X                      if((damage = zapyourself(instr)))
  609. X!                       losehp(damage,
  610. X!         self_pronoun("using a magical horn on %sself", "him"),
  611. X!                       NO_KILLER_PREFIX);
  612. X                      makeknown(instr->otyp);
  613. X                      return(2);
  614. X                  }
  615. X***************
  616. X*** 368,374 ****
  617. X      pline("What tune are you playing? [what 5 notes] ");
  618. X      getlin(buf);
  619. X      for(s=buf;*s;s++)
  620. X!         *s = (*s >='a' && *s<='z') ? 'A' + *s - 'a' : *s;
  621. X      You("extract a strange sound from the %s!",xname(instr));
  622. X      /* Check if there was the Stronghold drawbridge near
  623. X       * and if the tune conforms to what we're waiting for.
  624. X--- 384,390 ----
  625. X      pline("What tune are you playing? [what 5 notes] ");
  626. X      getlin(buf);
  627. X      for(s=buf;*s;s++)
  628. X!         if (islower(*s)) *s=toupper(*s);
  629. X      You("extract a strange sound from the %s!",xname(instr));
  630. X      /* Check if there was the Stronghold drawbridge near
  631. X       * and if the tune conforms to what we're waiting for.
  632. X*** src/Old/o_init.c    Mon Feb 19 20:38:04 1990
  633. X--- src/o_init.c    Thu Feb  1 18:45:03 1990
  634. X***************
  635. X*** 4,9 ****
  636. X--- 4,13 ----
  637. X  
  638. X  #include    "hack.h"        /* for typedefs */
  639. X  
  640. X+ static void NDECL(setgemprobs);
  641. X+ static void FDECL(shuffle,(int,int,BOOLEAN_P));
  642. X+ static boolean FDECL(interesting_to_discover,(int));
  643. X+ 
  644. X  /* note that NROFOBJECTS is the number of legal objects, which does not count
  645. X   * the strange object and null object that take up positions 0 and NROFOBJECTS+1
  646. X   * in the objects array
  647. X***************
  648. X*** 70,76 ****
  649. X      register boolean domaterial;
  650. X  {
  651. X      register int i, j;
  652. X!     char *desc;
  653. X  #ifdef TEXTCOLOR
  654. X      int color;
  655. X  #endif /* TEXTCOLOR */
  656. X--- 74,80 ----
  657. X      register boolean domaterial;
  658. X  {
  659. X      register int i, j;
  660. X!     const char *desc;
  661. X  #ifdef TEXTCOLOR
  662. X      int color;
  663. X  #endif /* TEXTCOLOR */
  664. X***************
  665. X*** 120,126 ****
  666. X          bases[i] = 0;
  667. X      for(i = 0; i != TOTAL_OBJS; i++)
  668. X          disco[i] = i;
  669. X! 
  670. X      /* init base; if probs given check that they add up to 1000,
  671. X         otherwise compute probs; shuffle descriptions */
  672. X      end = TOTAL_OBJS;
  673. X--- 124,132 ----
  674. X          bases[i] = 0;
  675. X      for(i = 0; i != TOTAL_OBJS; i++)
  676. X          disco[i] = i;
  677. X! #ifdef NAMED_ITEMS
  678. X!     init_exists();    /* zero out the "artifact exists" list */
  679. X! #endif
  680. X      /* init base; if probs given check that they add up to 1000,
  681. X         otherwise compute probs; shuffle descriptions */
  682. X      end = TOTAL_OBJS;
  683. X***************
  684. X*** 238,244 ****
  685. X  #ifdef MACOS
  686. X      for (i = 0 ; i < TOTAL_OBJS; i++) {
  687. X          descr[i] = objects[i].oc_descr;
  688. X!         objects[i].oc_descr = (char *)switches[i];
  689. X      }
  690. X  #endif
  691. X      bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * TOTAL_OBJS);
  692. X--- 244,250 ----
  693. X  #ifdef MACOS
  694. X      for (i = 0 ; i < TOTAL_OBJS; i++) {
  695. X          descr[i] = objects[i].oc_descr;
  696. X!         objects[i].oc_descr = (const char *)switches[i];
  697. X      }
  698. X  #endif
  699. X      bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * TOTAL_OBJS);
  700. X***************
  701. X*** 295,301 ****
  702. X          objects[i].oc_descr = d[switches[i]].descr;
  703. X      }
  704. X  #else
  705. X! # if !defined(MSDOS) && !defined(M_XENIX)
  706. X      differ = (genericptr_t)&objects[0] - (genericptr_t)then;
  707. X  # else
  708. X      differ = (long)&objects[0] - (long)then;
  709. X--- 301,307 ----
  710. X          objects[i].oc_descr = d[switches[i]].descr;
  711. X      }
  712. X  #else
  713. X! # if !defined(MSDOS) && !defined(M_XENIX) && !defined(HPUX)
  714. X      differ = (genericptr_t)&objects[0] - (genericptr_t)then;
  715. X  # else
  716. X      differ = (long)&objects[0] - (long)then;
  717. X***************
  718. X*** 308,314 ****
  719. X              objects[i].oc_name += differ;
  720. X  # else
  721. X              objects[i].oc_name =
  722. X!                 (char *)((long)(objects[i].oc_name) + differ);
  723. X  # endif
  724. X          }
  725. X          if (objects[i].oc_descr) {
  726. X--- 314,320 ----
  727. X              objects[i].oc_name += differ;
  728. X  # else
  729. X              objects[i].oc_name =
  730. X!                 (const char *)((long)(objects[i].oc_name) + differ);
  731. X  # endif
  732. X          }
  733. X          if (objects[i].oc_descr) {
  734. X***************
  735. X*** 316,322 ****
  736. X              objects[i].oc_descr += differ;
  737. X  # else
  738. X              objects[i].oc_descr =
  739. X!                 (char *)((long)(objects[i].oc_descr) + differ);
  740. X  # endif
  741. X          }
  742. X  #endif /* MACOS */
  743. X--- 322,328 ----
  744. X              objects[i].oc_descr += differ;
  745. X  # else
  746. X              objects[i].oc_descr =
  747. X!                 (const char *)((long)(objects[i].oc_descr) + differ);
  748. X  # endif
  749. X          }
  750. X  #endif /* MACOS */
  751. X*** src/Old/objects.c    Mon Feb 19 20:38:30 1990
  752. X--- src/objects.c    Wed Jan 17 23:02:38 1990
  753. X***************
  754. X*** 6,12 ****
  755. X   * function declarations for all of nethack
  756. X   */
  757. X  #define EXTERN_H
  758. X- /* #define MAKEDEFS_C    1    /* for Mac compilers with 32K data limit */
  759. X  #include "config.h"
  760. X  #include "obj.h"
  761. X  #include "objclass.h"
  762. X--- 6,11 ----
  763. X***************
  764. X*** 376,382 ****
  765. X  #else
  766. X      { "pick-axe", NULL, NULL, 1,0,1,1,METAL, 0, TOOL_SYM, 20,
  767. X                          0, 10, 50, 6, 3, 0, C(HI_METAL)},
  768. X!     { "unicorn horn", NULL, NULL, 1,0,1,0,0, 0, TOOL_SYM, 0,
  769. X                          0, 4, 100, 12, 12, 0, C(WHITE)},
  770. X      { "blinding venom", "splash of venom", NULL,
  771. X          0,1,0,0,0, 0, VENOM_SYM, 500, 0, 0, 0, 0, 0, 0, C(HI_ORGANIC)},
  772. X--- 375,381 ----
  773. X  #else
  774. X      { "pick-axe", NULL, NULL, 1,0,1,1,METAL, 0, TOOL_SYM, 20,
  775. X                          0, 10, 50, 6, 3, 0, C(HI_METAL)},
  776. X!     { "unicorn horn", NULL, NULL, 1,0,1,1,0, 0, TOOL_SYM, 0,
  777. X                          0, 4, 100, 12, 12, 0, C(WHITE)},
  778. X      { "blinding venom", "splash of venom", NULL,
  779. X          0,1,0,0,0, 0, VENOM_SYM, 500, 0, 0, 0, 0, 0, 0, C(HI_ORGANIC)},
  780. X***************
  781. X*** 437,443 ****
  782. X  ARMOR("plate mail", NULL,
  783. X              1, 1, 0, 44, 5, 9, 600, 3, 2, METAL, HI_METAL),
  784. X  ARMOR("crystal plate mail", NULL,
  785. X!             1, 1, 0, 10, 5, 9, 820, 3, 2, 0, WHITE|BRIGHT),
  786. X  #ifdef SHIRT
  787. X  ARMOR("bronze plate mail", NULL,
  788. X              1, 1, 0, 25, 5, 9, 400, 4, 0, COPPER, HI_COPPER),
  789. X--- 436,442 ----
  790. X  ARMOR("plate mail", NULL,
  791. X              1, 1, 0, 44, 5, 9, 600, 3, 2, METAL, HI_METAL),
  792. X  ARMOR("crystal plate mail", NULL,
  793. X!             1, 1, 0, 10, 5, 9, 820, 3, 2, GLASS, WHITE|BRIGHT),
  794. X  #ifdef SHIRT
  795. X  ARMOR("bronze plate mail", NULL,
  796. X              1, 1, 0, 25, 5, 9, 400, 4, 0, COPPER, HI_COPPER),
  797. X*** src/Old/objnam.c    Mon Feb 19 20:40:32 1990
  798. X--- src/objnam.c    Sat Feb 17 21:15:08 1990
  799. X***************
  800. X*** 9,26 ****
  801. X  #define    PREFIX    50
  802. X  #define SCHAR_MAX 127
  803. X  
  804. X  /*    We want the player to be able to learn what key goes in what lock.  */
  805. X! const char *keystr[N_LOX] = { "round", "square", "triangular", "oval",
  806. X!                 "octagonal", "hexagonal", "cylindrical",
  807. X!                 "irregular", "conical", "wedge-shaped" },
  808. X!        *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
  809. X!                 "octagonal", "hexagonal", "wide",
  810. X!                 "notched", "large round", "large square" };
  811. X  
  812. X  static int FDECL(rnd_class, (int,int));
  813. X  
  814. X! static int
  815. X! named_key(s) register char *s; {
  816. X      char tc[BUFSZ];
  817. X      register int i;
  818. X  
  819. X--- 9,51 ----
  820. X  #define    PREFIX    50
  821. X  #define SCHAR_MAX 127
  822. X  
  823. X+ #ifndef OVLB
  824. X+ 
  825. X+ OSTATIC const char *keystr[N_LOX], *lockstr[N_LOX];
  826. X+ 
  827. X+ #else /* OVLB */
  828. X  /*    We want the player to be able to learn what key goes in what lock.  */
  829. X! XSTATIC const char *keystr[N_LOX] = { "round", "square", "triangular", "oval",
  830. X!                           "octagonal", "hexagonal", "cylindrical",
  831. X!                           "irregular", "conical", "wedge-shaped" },
  832. X!               *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
  833. X!                           "octagonal", "hexagonal", "wide",
  834. X!                           "notched", "large round", "large square" };
  835. X! #endif /* OVLB */
  836. X  
  837. X  static int FDECL(rnd_class, (int,int));
  838. X+ OSTATIC int FDECL(named_key,(const char *));
  839. X+ OSTATIC int FDECL(named_box,(const char *));
  840. X+ OSTATIC char *FDECL(strprepend,(char *,const char *));
  841. X+ static char *FDECL(sitoa,(int));
  842. X  
  843. X! static struct Jitem {
  844. X!     int item;
  845. X!     const char *name;
  846. X! } Japanese_items[] = {
  847. X!     { SHORT_SWORD, "wakizashi" },
  848. X!     { BROADSWORD, "ninja-to" },
  849. X!     { GLAIVE, "naginata" },
  850. X!     /* { BOW, "yumi" }, */
  851. X!     { LOCK_PICK, "osaku" },
  852. X!     {0, "" }
  853. X! };
  854. X! OSTATIC const char *FDECL(Japanese_item_name,(int));
  855. X! 
  856. X! #ifdef OVL1
  857. X! 
  858. X! XSTATIC int
  859. X! named_key(s) register const char *s; {
  860. X      char tc[BUFSZ];
  861. X      register int i;
  862. X  
  863. X***************
  864. X*** 32,40 ****
  865. X      return(0);
  866. X  }
  867. X  
  868. X! static int
  869. X  named_box(s)
  870. X! register char *s;
  871. X  {
  872. X      char tc[BUFSZ];
  873. X      register int i;
  874. X--- 57,65 ----
  875. X      return(0);
  876. X  }
  877. X  
  878. X! XSTATIC int
  879. X  named_box(s)
  880. X! register const char *s;
  881. X  {
  882. X      char tc[BUFSZ];
  883. X      register int i;
  884. X***************
  885. X*** 47,54 ****
  886. X      return(0);
  887. X  }
  888. X  
  889. X! static char *
  890. X! strprepend(s,pref) register char *s, *pref; {
  891. X  register int i = strlen(pref);
  892. X      if(i > PREFIX) {
  893. X          pline("WARNING: prefix too short.");
  894. X--- 72,81 ----
  895. X      return(0);
  896. X  }
  897. X  
  898. X! XSTATIC char *
  899. X! strprepend(s,pref)
  900. X! register char *s;
  901. X! register const char *pref; {
  902. X  register int i = strlen(pref);
  903. X      if(i > PREFIX) {
  904. X          pline("WARNING: prefix too short.");
  905. X***************
  906. X*** 70,75 ****
  907. X--- 97,105 ----
  908. X      return(buf);
  909. X  }
  910. X  
  911. X+ #endif /* OVL1 */
  912. X+ #ifdef OVLB
  913. X+ 
  914. X  char *
  915. X  typename(otyp)
  916. X  register int otyp;
  917. X***************
  918. X*** 80,89 ****
  919. X  static char buf[BUFSZ];
  920. X  #endif
  921. X  register struct objclass *ocl = &objects[otyp];
  922. X! register char *actualn = ocl->oc_name;
  923. X! register char *dn = ocl->oc_descr;
  924. X! register char *un = ocl->oc_uname;
  925. X  register int nn = ocl->oc_name_known;
  926. X      switch(ocl->oc_olet) {
  927. X      case POTION_SYM:
  928. X          Strcpy(buf, "potion");
  929. X--- 110,122 ----
  930. X  static char buf[BUFSZ];
  931. X  #endif
  932. X  register struct objclass *ocl = &objects[otyp];
  933. X! register const char *actualn = ocl->oc_name;
  934. X! register const char *dn = ocl->oc_descr;
  935. X! register const char *un = ocl->oc_uname;
  936. X  register int nn = ocl->oc_name_known;
  937. X+ 
  938. X+     if (pl_character[0] == 'S' && Japanese_item_name(otyp))
  939. X+         actualn = Japanese_item_name(otyp);
  940. X      switch(ocl->oc_olet) {
  941. X      case POTION_SYM:
  942. X          Strcpy(buf, "potion");
  943. X***************
  944. X*** 165,170 ****
  945. X--- 198,206 ----
  946. X      return str;
  947. X  }
  948. X  
  949. X+ #endif /* OVLB */
  950. X+ #ifdef OVL1
  951. X+ 
  952. X  char *
  953. X  xname(obj)
  954. X  register struct obj *obj;
  955. X***************
  956. X*** 176,184 ****
  957. X  #endif
  958. X  register char *buf = &(bufr[PREFIX]);    /* leave room for "17 -3 " */
  959. X  register int nn = objects[obj->otyp].oc_name_known;
  960. X! register char *actualn = objects[obj->otyp].oc_name;
  961. X! register char *dn = objects[obj->otyp].oc_descr;
  962. X! register char *un = objects[obj->otyp].oc_uname;
  963. X  
  964. X      buf[0] = 0;
  965. X      if(!Blind) obj->dknown=1;
  966. X--- 212,223 ----
  967. X  #endif
  968. X  register char *buf = &(bufr[PREFIX]);    /* leave room for "17 -3 " */
  969. X  register int nn = objects[obj->otyp].oc_name_known;
  970. X! register const char *actualn = objects[obj->otyp].oc_name;
  971. X! register const char *dn = objects[obj->otyp].oc_descr;
  972. X! register const char *un = objects[obj->otyp].oc_uname;
  973. X! 
  974. X!     if (pl_character[0] == 'S' && Japanese_item_name((int)obj->otyp))
  975. X!         actualn = Japanese_item_name((int)obj->otyp);
  976. X  
  977. X      buf[0] = 0;
  978. X      if(!Blind) obj->dknown=1;
  979. X***************
  980. X*** 202,212 ****
  981. X              Strcpy(buf, "poisoned ");
  982. X          case VENOM_SYM:
  983. X          case TOOL_SYM:
  984. X!         if(nn)    Strcat(buf, actualn);
  985. X!         else    Strcat(buf, dn);
  986. X          if(obj->otyp == FIGURINE)
  987. X!             Sprintf(eos(buf), " of %s",
  988. X!                 an(mons[obj->corpsenm].mname));
  989. X          break;
  990. X          case ARMOR_SYM:
  991. X          if(obj->otyp==DRAGON_SCALE_MAIL) {
  992. X--- 241,263 ----
  993. X              Strcpy(buf, "poisoned ");
  994. X          case VENOM_SYM:
  995. X          case TOOL_SYM:
  996. X!         if(un) {
  997. X!             /* un must come first here.  If it does not, they could
  998. X!              * tell objects apart by seeing which ones refuse to
  999. X!              * accept names.
  1000. X!              */
  1001. X!             Sprintf(buf, "%s called %s",
  1002. X!                 nn ? actualn : dn, un);
  1003. X!         } else if(nn)
  1004. X!             Strcat(buf, actualn);
  1005. X!         else
  1006. X!             Strcat(buf, dn);
  1007. X!         /* If we use an() here we'd have to remember never to use */
  1008. X!         /* it whenever calling doname() or xname(). */
  1009. X          if(obj->otyp == FIGURINE)
  1010. X!             Sprintf(eos(buf), " of a%s %s",
  1011. X!             index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
  1012. X!             mons[obj->corpsenm].mname);
  1013. X          break;
  1014. X          case ARMOR_SYM:
  1015. X          if(obj->otyp==DRAGON_SCALE_MAIL) {
  1016. X***************
  1017. X*** 266,272 ****
  1018. X          break;
  1019. X          case ROCK_SYM:
  1020. X          if(obj->otyp == STATUE)
  1021. X!             Sprintf(buf, "%s of %s", actualn, an(mons[obj->corpsenm].mname));
  1022. X          else Strcpy(buf, actualn);
  1023. X          break;
  1024. X          case BALL_SYM:
  1025. X--- 317,325 ----
  1026. X          break;
  1027. X          case ROCK_SYM:
  1028. X          if(obj->otyp == STATUE)
  1029. X!             Sprintf(buf, "%s of a%s %s", actualn,
  1030. X!             index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
  1031. X!             mons[obj->corpsenm].mname);
  1032. X          else Strcpy(buf, actualn);
  1033. X          break;
  1034. X          case BALL_SYM:
  1035. X***************
  1036. X*** 351,358 ****
  1037. X              break;
  1038. X          }
  1039. X          if(!nn) {
  1040. X!             char *rock=(obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE)
  1041. X!                 ? "stone" : "gem";
  1042. X              if(un)    Sprintf(buf,"%s called %s", rock, un);
  1043. X              else    Sprintf(buf, "%s %s", dn, rock);
  1044. X              break;
  1045. X--- 404,411 ----
  1046. X              break;
  1047. X          }
  1048. X          if(!nn) {
  1049. X!             const char *rock=
  1050. X!     (obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE) ? "stone" : "gem";
  1051. X              if(un)    Sprintf(buf,"%s called %s", rock, un);
  1052. X              else    Sprintf(buf, "%s %s", dn, rock);
  1053. X              break;
  1054. X***************
  1055. X*** 374,379 ****
  1056. X--- 427,435 ----
  1057. X      return(buf);
  1058. X  }
  1059. X  
  1060. X+ #endif /* OVL1 */
  1061. X+ #ifdef OVL0
  1062. X+ 
  1063. X  char *
  1064. X  doname(obj)
  1065. X  register struct obj *obj;
  1066. X***************
  1067. X*** 544,549 ****
  1068. X--- 600,608 ----
  1069. X      return(bp);
  1070. X  }
  1071. X  
  1072. X+ #endif /* OVL0 */
  1073. X+ #ifdef OVLB
  1074. X+ 
  1075. X  /*
  1076. X   * Used if only one of a collection of objects is named (e.g. in eat.c).
  1077. X   */
  1078. X***************
  1079. X*** 572,578 ****
  1080. X  
  1081. X  char *
  1082. X  an(str)
  1083. X! register char *str;
  1084. X  {
  1085. X      static char buf[BUFSZ];
  1086. X  
  1087. X--- 631,637 ----
  1088. X  
  1089. X  char *
  1090. X  an(str)
  1091. X! register const char *str;
  1092. X  {
  1093. X      static char buf[BUFSZ];
  1094. X  
  1095. X***************
  1096. X*** 592,608 ****
  1097. X  
  1098. X  char *
  1099. X  An(str)
  1100. X! register char *str;
  1101. X  {
  1102. X!     str = an(str);
  1103. X!     if (*str == 'a') *str = 'A';
  1104. X!     return str;
  1105. X  }
  1106. X  
  1107. X  char *
  1108. X! aobjnam(otmp,verb) register struct obj *otmp; register char *verb; {
  1109. X! register char *bp = xname(otmp);
  1110. X! char prefix[PREFIX];
  1111. X      if(otmp->quan != 1) {
  1112. X          Sprintf(prefix, "%u ", otmp->quan);
  1113. X          bp = strprepend(bp, prefix);
  1114. X--- 651,673 ----
  1115. X  
  1116. X  char *
  1117. X  An(str)
  1118. X! const char *str;
  1119. X  {
  1120. X!     register char *tmp;
  1121. X! 
  1122. X!     tmp = an(str);
  1123. X!     if (*tmp == 'a') *tmp = 'A';
  1124. X!     return tmp;
  1125. X  }
  1126. X  
  1127. X  char *
  1128. X! aobjnam(otmp,verb)
  1129. X! register struct obj *otmp;
  1130. X! register const char *verb;
  1131. X! {
  1132. X!     register char *bp = xname(otmp);
  1133. X!     char prefix[PREFIX];
  1134. X! 
  1135. X      if(otmp->quan != 1) {
  1136. X          Sprintf(prefix, "%u ", otmp->quan);
  1137. X          bp = strprepend(bp, prefix);
  1138. X***************
  1139. X*** 656,661 ****
  1140. X--- 721,729 ----
  1141. X          if('A' <= *p && *p <= 'Z') *p += 'a'-'A';
  1142. X  }
  1143. X  
  1144. X+ #endif /* OVLB */
  1145. X+ #ifdef OVL0
  1146. X+ 
  1147. X  /* Plural routine; chiefly used for user-defined fruits.  We have to try to
  1148. X   * account for everything reasonable the player has; something unreasonable
  1149. X   * can still break the code.  However, it's still a lot more accurate than
  1150. X***************
  1151. X*** 666,682 ****
  1152. X   */
  1153. X  char *
  1154. X  makeplural(oldstr)
  1155. X! char *oldstr;
  1156. X  {
  1157. X      register char *spot;
  1158. X      static char str[BUFSZ];
  1159. X!     static char *excess;
  1160. X      int len;
  1161. X  
  1162. X      while (*oldstr==' ') oldstr++;
  1163. X      if (!oldstr || !*oldstr) {
  1164. X          impossible("plural of null?");
  1165. X!         return("s");
  1166. X      }
  1167. X      Strcpy(str, oldstr);
  1168. X  
  1169. X--- 734,751 ----
  1170. X   */
  1171. X  char *
  1172. X  makeplural(oldstr)
  1173. X! const char *oldstr;
  1174. X  {
  1175. X      register char *spot;
  1176. X      static char str[BUFSZ];
  1177. X!     const char *excess;
  1178. X      int len;
  1179. X  
  1180. X      while (*oldstr==' ') oldstr++;
  1181. X      if (!oldstr || !*oldstr) {
  1182. X          impossible("plural of null?");
  1183. X!         Strcpy(str, "s");
  1184. X!         return str;
  1185. X      }
  1186. X      Strcpy(str, oldstr);
  1187. X  
  1188. X***************
  1189. X*** 853,863 ****
  1190. X      return str;
  1191. X  }
  1192. X  
  1193. X! /* wishable subranges of objects */
  1194. X! static const struct o_range {
  1195. X!     char *name, osym;
  1196. X      int  f_o_range, l_o_range;
  1197. X! } o_ranges[] = {
  1198. X      { "bag",    TOOL_SYM,   SACK,        BAG_OF_TRICKS },
  1199. X      { "gloves",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1200. X      { "gauntlets",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1201. X--- 922,942 ----
  1202. X      return str;
  1203. X  }
  1204. X  
  1205. X! #endif /* OVL0 */
  1206. X! 
  1207. X! struct o_range {
  1208. X!     const char *name, osym;
  1209. X      int  f_o_range, l_o_range;
  1210. X! };
  1211. X! 
  1212. X! #ifndef OVLB
  1213. X! 
  1214. X! OSTATIC const struct o_range o_ranges[];
  1215. X! 
  1216. X! #else /* OVLB */
  1217. X! 
  1218. X! /* wishable subranges of objects */
  1219. X! XSTATIC const struct o_range o_ranges[] = {
  1220. X      { "bag",    TOOL_SYM,   SACK,        BAG_OF_TRICKS },
  1221. X      { "gloves",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1222. X      { "gauntlets",    ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
  1223. X***************
  1224. X*** 873,891 ****
  1225. X      { "sword",    WEAPON_SYM, SHORT_SWORD,    KATANA }
  1226. X  };
  1227. X  
  1228. X- 
  1229. X  /*
  1230. X   * Singularize a string the user typed in; this helps reduce the complexity
  1231. X!  * of readobjnam.
  1232. X   */
  1233. X  
  1234. X! static
  1235. X! void
  1236. X! singularize(bp)
  1237. X! char *bp;
  1238. X  {
  1239. X!     char *p;
  1240. X  
  1241. X      /* find "cloves of garlic", "worthless pieces of blue glass" */
  1242. X      for(p = bp; *p; p++) 
  1243. X          if(!strncmp(p, "s of ", 5)){
  1244. X--- 952,978 ----
  1245. X      { "sword",    WEAPON_SYM, SHORT_SWORD,    KATANA }
  1246. X  };
  1247. X  
  1248. X  /*
  1249. X   * Singularize a string the user typed in; this helps reduce the complexity
  1250. X!  * of readobjnam, and is also used in pager.c to singularize the string
  1251. X!  * for which help is sought.
  1252. X   */
  1253. X  
  1254. X! char *
  1255. X! makesingular(oldstr)
  1256. X! const char *oldstr;
  1257. X  {
  1258. X!     char *p, *bp;
  1259. X!     static char str[BUFSZ];
  1260. X! 
  1261. X!     if (!oldstr || !*oldstr) {
  1262. X!         impossible("singular of null?");
  1263. X!         str[0] = 0; return str;
  1264. X!     }
  1265. X!     Strcpy(str, oldstr);
  1266. X!     bp = str;
  1267. X  
  1268. X+     while (*bp == ' ') bp++;
  1269. X      /* find "cloves of garlic", "worthless pieces of blue glass" */
  1270. X      for(p = bp; *p; p++) 
  1271. X          if(!strncmp(p, "s of ", 5)){
  1272. X***************
  1273. X*** 892,898 ****
  1274. X          /* but don't singularize "gauntlets" */
  1275. X          if(strncmp(p-8, "gauntlet", 8))
  1276. X              while(*p = p[1]) p++;
  1277. X!         return;
  1278. X          }
  1279. X  
  1280. X      /* remove -s or -es (boxes) or -ies (rubies) */
  1281. X--- 979,985 ----
  1282. X          /* but don't singularize "gauntlets" */
  1283. X          if(strncmp(p-8, "gauntlet", 8))
  1284. X              while(*p = p[1]) p++;
  1285. X!         return bp;
  1286. X          }
  1287. X  
  1288. X      /* remove -s or -es (boxes) or -ies (rubies) */
  1289. X***************
  1290. X*** 904,942 ****
  1291. X                     !strcmp(p-4, "pies"))
  1292. X                      goto mins;
  1293. X                  Strcpy(p-3, "y");
  1294. X!                 return;
  1295. X              }
  1296. X  
  1297. X              /* note: cloves / knives from clove / knife */
  1298. X              if(!strcmp(p-6, "knives")) {
  1299. X                  Strcpy(p-3, "fe");
  1300. X!                 return;
  1301. X              }
  1302. X  
  1303. X              if(!strcmp(p-6, "staves")) {
  1304. X                  Strcpy(p-3, "ff");
  1305. X!                 return;
  1306. X              }
  1307. X  
  1308. X              /* note: nurses, axes but boxes */
  1309. X              if(!strcmp(p-5, "boxes")) {
  1310. X                  p[-2] = 0;
  1311. X!                 return;
  1312. X              }
  1313. X          }
  1314. X          /* but don't singularize boots or gloves */
  1315. X          else if(!strcmp(p-5, "boots") ||
  1316. X              !strcmp(p-6, "gloves"))
  1317. X!                 return;
  1318. X      mins:
  1319. X          p[-1] = 0;
  1320. X      } else {
  1321. X          if(!strcmp(p-5, "teeth")) {
  1322. X              Strcpy(p-5, "tooth");
  1323. X!             return;
  1324. X          }
  1325. X          /* here we cannot find the plural suffix */
  1326. X      }
  1327. X  }
  1328. X  
  1329. X  /* Return something wished for.  If not an object, return &zeroobj; if an error
  1330. X--- 991,1030 ----
  1331. X                     !strcmp(p-4, "pies"))
  1332. X                      goto mins;
  1333. X                  Strcpy(p-3, "y");
  1334. X!                 return bp;
  1335. X              }
  1336. X  
  1337. X              /* note: cloves / knives from clove / knife */
  1338. X              if(!strcmp(p-6, "knives")) {
  1339. X                  Strcpy(p-3, "fe");
  1340. X!                 return bp;
  1341. X              }
  1342. X  
  1343. X              if(!strcmp(p-6, "staves")) {
  1344. X                  Strcpy(p-3, "ff");
  1345. X!                 return bp;
  1346. X              }
  1347. X  
  1348. X              /* note: nurses, axes but boxes */
  1349. X              if(!strcmp(p-5, "boxes")) {
  1350. X                  p[-2] = 0;
  1351. X!                 return bp;
  1352. X              }
  1353. X          }
  1354. X          /* but don't singularize boots or gloves */
  1355. X          else if(!strcmp(p-5, "boots") ||
  1356. X              !strcmp(p-6, "gloves"))
  1357. X!                 return bp;
  1358. X      mins:
  1359. X          p[-1] = 0;
  1360. X      } else {
  1361. X          if(!strcmp(p-5, "teeth")) {
  1362. X              Strcpy(p-5, "tooth");
  1363. X!             return bp;
  1364. X          }
  1365. X          /* here we cannot find the plural suffix */
  1366. X      }
  1367. X+     return bp;
  1368. X  }
  1369. X  
  1370. X  /* Return something wished for.  If not an object, return &zeroobj; if an error
  1371. X***************
  1372. X*** 964,970 ****
  1373. X       */
  1374. X  #endif
  1375. X      char let;
  1376. X!     char *un, *dn, *an;
  1377. X      char *name=0;
  1378. X  #ifdef WIZARD
  1379. X      int fake=0;
  1380. X--- 1052,1058 ----
  1381. X       */
  1382. X  #endif
  1383. X      char let;
  1384. X!     char *un, *dn, *actualn;
  1385. X      char *name=0;
  1386. X  #ifdef WIZARD
  1387. X      int fake=0;
  1388. X***************
  1389. X*** 978,984 ****
  1390. X  #define SPINACH 2
  1391. X      contents = UNDEFINED;
  1392. X      let = 0;
  1393. X!     an = dn = un = 0;
  1394. X      
  1395. X      for(;;) {
  1396. X          if (!bp) goto any;
  1397. X--- 1066,1072 ----
  1398. X  #define SPINACH 2
  1399. X      contents = UNDEFINED;
  1400. X      let = 0;
  1401. X!     actualn = dn = un = 0;
  1402. X      
  1403. X      for(;;) {
  1404. X          if (!bp) goto any;
  1405. X***************
  1406. X*** 1135,1142 ****
  1407. X      }
  1408. X  
  1409. X      /* first change to singular if necessary */
  1410. X!     if(cnt != 1)
  1411. X!         singularize(bp);
  1412. X  
  1413. X  sing:
  1414. X      /* Maybe we need a special strcmp() which ignores capitalization and
  1415. X--- 1223,1230 ----
  1416. X      }
  1417. X  
  1418. X      /* first change to singular if necessary */
  1419. X!     if(cnt != 1 && *bp)
  1420. X!         Strcpy(bp, makesingular(bp));
  1421. X  
  1422. X  sing:
  1423. X      /* Maybe we need a special strcmp() which ignores capitalization and
  1424. X***************
  1425. X*** 1174,1185 ****
  1426. X         !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
  1427. X         !strcmp(bp, "studded leather armor")) {
  1428. X          let = ARMOR_SYM;
  1429. X!         an = bp;
  1430. X          goto srch;
  1431. X      }
  1432. X      if(!strcmp(bp, "food ration")){
  1433. X          let = FOOD_SYM;
  1434. X!         an = bp;
  1435. X          goto srch;
  1436. X      }
  1437. X      if((iskey = named_key(bp)) > 0) {
  1438. X--- 1262,1273 ----
  1439. X         !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
  1440. X         !strcmp(bp, "studded leather armor")) {
  1441. X          let = ARMOR_SYM;
  1442. X!         actualn = bp;
  1443. X          goto srch;
  1444. X      }
  1445. X      if(!strcmp(bp, "food ration")){
  1446. X          let = FOOD_SYM;
  1447. X!         actualn = bp;
  1448. X          goto srch;
  1449. X      }
  1450. X      if((iskey = named_key(bp)) > 0) {
  1451. X***************
  1452. X*** 1213,1222 ****
  1453. X              let = wrpsym[i];
  1454. X              if(let != AMULET_SYM) {
  1455. X                  bp += j;
  1456. X!                 if(!strncmp(bp, " of ", 4)) an = bp+4;
  1457. X                  /* else if(*bp) ?? */
  1458. X              } else
  1459. X!                 an = bp;
  1460. X              goto srch;
  1461. X          }
  1462. X          if(!strcmp(p-j, wrp[i])){
  1463. X--- 1301,1310 ----
  1464. X              let = wrpsym[i];
  1465. X              if(let != AMULET_SYM) {
  1466. X                  bp += j;
  1467. X!                 if(!strncmp(bp, " of ", 4)) actualn = bp+4;
  1468. X                  /* else if(*bp) ?? */
  1469. X              } else
  1470. X!                 actualn = bp;
  1471. X              goto srch;
  1472. X          }
  1473. X          if(!strcmp(p-j, wrp[i])){
  1474. X***************
  1475. X*** 1231,1237 ****
  1476. X      if(!strcmp(p-6, " stone")){
  1477. X          p[-6] = 0;
  1478. X          let = GEM_SYM;
  1479. X!         dn = an = bp;
  1480. X          goto srch;
  1481. X      }
  1482. X      if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
  1483. X--- 1319,1325 ----
  1484. X      if(!strcmp(p-6, " stone")){
  1485. X          p[-6] = 0;
  1486. X          let = GEM_SYM;
  1487. X!         dn = actualn = bp;
  1488. X          goto srch;
  1489. X      }
  1490. X      if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
  1491. X***************
  1492. X*** 1278,1292 ****
  1493. X          goto typfnd;
  1494. X          }
  1495. X  
  1496. X!     an = bp;
  1497. X!     if (!dn) dn = an; /* ex. "black cap" */
  1498. X  srch:
  1499. X      i = 1;
  1500. X      if(let) i = bases[letindex(let)];
  1501. X      while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
  1502. X!         register char *zn;
  1503. X  
  1504. X!         if(an && (zn = objects[i].oc_name) && !strcmp(an, zn)) {
  1505. X              typ = i;
  1506. X              goto typfnd;
  1507. X          }
  1508. X--- 1366,1380 ----
  1509. X          goto typfnd;
  1510. X          }
  1511. X  
  1512. X!     actualn = bp;
  1513. X!     if (!dn) dn = actualn; /* ex. "black cap" */
  1514. X  srch:
  1515. X      i = 1;
  1516. X      if(let) i = bases[letindex(let)];
  1517. X      while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
  1518. X!         register const char *zn;
  1519. X  
  1520. X!         if(actualn && (zn = objects[i].oc_name) && !strcmp(actualn, zn)) {
  1521. X              typ = i;
  1522. X              goto typfnd;
  1523. X          }
  1524. X***************
  1525. X*** 1300,1305 ****
  1526. X--- 1388,1403 ----
  1527. X          }
  1528. X          i++;
  1529. X      }
  1530. X+     if (actualn) {
  1531. X+         struct Jitem *j = Japanese_items;
  1532. X+         while(j->item) {
  1533. X+             if (actualn && !strcmp(actualn, j->name)) {
  1534. X+                 typ = j->item;
  1535. X+                 goto typfnd;
  1536. X+             }
  1537. X+             j++;
  1538. X+         }
  1539. X+     }
  1540. X  #ifdef TUTTI_FRUTTI
  1541. X      for(f=ffruit; f; f = f->nextf) {
  1542. X          char *f1 = f->fname, *f2 = makeplural(f->fname);
  1543. X***************
  1544. X*** 1351,1357 ****
  1545. X          wizard ||
  1546. X  #endif
  1547. X           (cnt <= 20 &&
  1548. X!           (let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK))))
  1549. X              otmp->quan = cnt;
  1550. X  
  1551. X      if (spesgn == 0) spe = otmp->spe;
  1552. X--- 1449,1455 ----
  1553. X          wizard ||
  1554. X  #endif
  1555. X           (cnt <= 20 &&
  1556. X!           ((let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK)))))
  1557. X              otmp->quan = cnt;
  1558. X  
  1559. X      if (spesgn == 0) spe = otmp->spe;
  1560. X***************
  1561. X*** 1362,1368 ****
  1562. X              typ == UNICORN_HORN ||
  1563. X              (let==RING_SYM && objects[typ].oc_charged)) {
  1564. X          if(spe > rnd(5) && spe > otmp->spe) spe = 0;
  1565. X!         if(spe > 2 && u.uluck < 0) spesgn = -1;
  1566. X      } else {
  1567. X          if (let == WAND_SYM) {
  1568. X              if (spe > 1 && spesgn == -1) spe = 1;
  1569. X--- 1460,1466 ----
  1570. X              typ == UNICORN_HORN ||
  1571. X              (let==RING_SYM && objects[typ].oc_charged)) {
  1572. X          if(spe > rnd(5) && spe > otmp->spe) spe = 0;
  1573. X!         if(spe > 2 && Luck < 0) spesgn = -1;
  1574. X      } else {
  1575. X          if (let == WAND_SYM) {
  1576. X              if (spe > 1 && spesgn == -1) spe = 1;
  1577. X***************
  1578. X*** 1461,1482 ****
  1579. X          curse(otmp);
  1580. X      } else if (uncursed) {
  1581. X          otmp->blessed = 0;
  1582. X!         otmp->cursed = (u.uluck < 0);
  1583. X      } else if (blessed) {
  1584. X!         otmp->blessed = (u.uluck >= 0);
  1585. X!         otmp->cursed = (u.uluck < 0);
  1586. X      } else if (spesgn < 0) {
  1587. X          curse(otmp);
  1588. X      }
  1589. X  
  1590. X      /* prevent wishing abuse */
  1591. X!     if (otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP)
  1592. X          otmp->recharged = 1;
  1593. X  
  1594. X      /* set poisoned */
  1595. X      if (ispoisoned) {
  1596. X          if (let == WEAPON_SYM && typ <= SHURIKEN)
  1597. X!         otmp->opoisoned = (u.uluck >= 0);
  1598. X  #ifdef WIZARD
  1599. X          else if (Is_box(otmp))
  1600. X          otmp->otrapped = 1;
  1601. X--- 1559,1596 ----
  1602. X          curse(otmp);
  1603. X      } else if (uncursed) {
  1604. X          otmp->blessed = 0;
  1605. X!         otmp->cursed = (Luck < 0
  1606. X! #ifdef WIZARD
  1607. X!                      && !wizard
  1608. X! #endif
  1609. X!                             );
  1610. X      } else if (blessed) {
  1611. X!         otmp->blessed = (Luck >= 0
  1612. X! #ifdef WIZARD
  1613. X!                      || wizard
  1614. X! #endif
  1615. X!                             );
  1616. X!         otmp->cursed = (Luck < 0
  1617. X! #ifdef WIZARD
  1618. X!                      && !wizard
  1619. X! #endif
  1620. X!                             );
  1621. X      } else if (spesgn < 0) {
  1622. X          curse(otmp);
  1623. X      }
  1624. X  
  1625. X      /* prevent wishing abuse */
  1626. X!     if (
  1627. X! #ifdef WIZARD
  1628. X!         !wizard &&
  1629. X! #endif
  1630. X!         (otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP))
  1631. X          otmp->recharged = 1;
  1632. X  
  1633. X      /* set poisoned */
  1634. X      if (ispoisoned) {
  1635. X          if (let == WEAPON_SYM && typ <= SHURIKEN)
  1636. X!         otmp->opoisoned = (Luck >= 0);
  1637. X  #ifdef WIZARD
  1638. X          else if (Is_box(otmp))
  1639. X          otmp->otrapped = 1;
  1640. X***************
  1641. X*** 1514,1516 ****
  1642. X--- 1628,1645 ----
  1643. X              return i;
  1644. X      return 0;
  1645. X  }
  1646. X+ 
  1647. X+ XSTATIC const char *
  1648. X+ Japanese_item_name(i)
  1649. X+ int i;
  1650. X+ {
  1651. X+     struct Jitem *j = Japanese_items;
  1652. X+ 
  1653. X+     while(j->item) {
  1654. X+         if (i == j->item)
  1655. X+             return j->name;
  1656. X+         j++;
  1657. X+     }
  1658. X+     return (const char *)0;
  1659. X+ }
  1660. X+ #endif /* OVLB */
  1661. X*** src/Old/options.c    Mon Feb 19 20:41:34 1990
  1662. X--- src/options.c    Thu Feb  1 20:16:30 1990
  1663. X***************
  1664. X*** 1,12 ****
  1665. X  /*    SCCS Id: @(#)options.c    3.0    89/11/15
  1666. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1667. X  /* NetHack may be freely redistributed.  See license for details. */
  1668. X- 
  1669. X  #include "hack.h"
  1670. X  static boolean set_order;
  1671. X  
  1672. X! static void FDECL(nmcpy, (char *, char *, int));
  1673. X! static int FDECL(next_opt, (char *));
  1674. X  
  1675. X  void
  1676. X  initoptions()
  1677. X--- 1,11 ----
  1678. X  /*    SCCS Id: @(#)options.c    3.0    89/11/15
  1679. X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  1680. X  /* NetHack may be freely redistributed.  See license for details. */
  1681. X  #include "hack.h"
  1682. X  static boolean set_order;
  1683. X  
  1684. X! static void FDECL(nmcpy, (char *, const char *, int));
  1685. X! void FDECL(escapes,(const char *, char *));
  1686. X  
  1687. X  void
  1688. X  initoptions()
  1689. X***************
  1690. X*** 16,23 ****
  1691. X      flags.time = flags.nonews = flags.notombstone = flags.end_own =
  1692. X      flags.standout = flags.nonull = flags.ignintr = FALSE;
  1693. X      flags.no_rest_on_space = flags.invlet_constant = TRUE;
  1694. X!     flags.end_top = 5;
  1695. X!     flags.end_around = 4;
  1696. X      flags.female = FALSE;            /* players are usually male */
  1697. X      flags.sortpack = TRUE;
  1698. X      flags.soundok = TRUE;
  1699. X--- 15,22 ----
  1700. X      flags.time = flags.nonews = flags.notombstone = flags.end_own =
  1701. X      flags.standout = flags.nonull = flags.ignintr = FALSE;
  1702. X      flags.no_rest_on_space = flags.invlet_constant = TRUE;
  1703. X!     flags.end_top = 3;
  1704. X!     flags.end_around = 2;
  1705. X      flags.female = FALSE;            /* players are usually male */
  1706. X      flags.sortpack = TRUE;
  1707. X      flags.soundok = TRUE;
  1708. X***************
  1709. X*** 25,34 ****
  1710. X      flags.confirm = TRUE;
  1711. X      flags.safe_dog = TRUE;
  1712. X      flags.silent =     flags.pickup = TRUE;
  1713. X- #ifdef MACOS
  1714. X-     flags.standout = TRUE;
  1715. X-     flags.end_around = 3;    /* Mac display routines don't scroll */
  1716. X- #endif
  1717. X  #ifdef TUTTI_FRUTTI
  1718. X      nmcpy(pl_fruit, objects[SLIME_MOLD].oc_name, PL_FSIZ);
  1719. X  #endif
  1720. X--- 24,29 ----
  1721. X***************
  1722. X*** 49,54 ****
  1723. X--- 44,56 ----
  1724. X  #endif
  1725. X      read_config_file();
  1726. X  #endif /* MSDOS */
  1727. X+ #ifdef MACOS
  1728. X+     flags.standout = TRUE;
  1729. X+     flags.end_around = 2;    /* Mac display routines don't scroll */
  1730. X+     flags.end_top = 4;
  1731. X+     read_config_file();
  1732. X+     
  1733. X+ #endif
  1734. X      if(opts = getenv("NETHACKOPTIONS"))
  1735. X          parseoptions(opts,TRUE);
  1736. X  #ifdef TUTTI_FRUTTI
  1737. X***************
  1738. X*** 60,79 ****
  1739. X  }
  1740. X  
  1741. X  static void
  1742. X! nmcpy(dest, source, maxlen)
  1743. X!     char    *dest, *source;
  1744. X      int    maxlen;
  1745. X  {
  1746. X-     char    *cs, *cd;
  1747. X      int    count;
  1748. X  
  1749. X-     cd = dest;
  1750. X-     cs = source;
  1751. X      for(count = 1; count < maxlen; count++) {
  1752. X!         if(*cs == ',' || *cs == '\0') break; /*exit on \0 terminator*/
  1753. X!         *cd++ = *cs++;
  1754. X      }
  1755. X!     *cd = 0;
  1756. X  }
  1757. X  
  1758. X  /*
  1759. X--- 62,79 ----
  1760. X  }
  1761. X  
  1762. X  static void
  1763. X! nmcpy(dest, src, maxlen)
  1764. X!     char    *dest;
  1765. X!     const char *src;
  1766. X      int    maxlen;
  1767. X  {
  1768. X      int    count;
  1769. X  
  1770. X      for(count = 1; count < maxlen; count++) {
  1771. X!         if(*src == ',' || *src == '\0') break; /*exit on \0 terminator*/
  1772. X!         *dest++ = *src++;
  1773. X      }
  1774. X!     *dest = 0;
  1775. X  }
  1776. X  
  1777. X  /*
  1778. X***************
  1779. X*** 85,91 ****
  1780. X   */
  1781. X  void
  1782. X  escapes(cp, tp)
  1783. X! char    *cp, *tp;
  1784. X  {
  1785. X      while (*cp)
  1786. X      {
  1787. X--- 85,92 ----
  1788. X   */
  1789. X  void
  1790. X  escapes(cp, tp)
  1791. X! const char    *cp;
  1792. X! char *tp;
  1793. X  {
  1794. X      while (*cp)
  1795. X      {
  1796. X***************
  1797. X*** 97,103 ****
  1798. X      }
  1799. X      if (*cp == '\\' && index("0123456789xXoO", cp[1]))
  1800. X      {
  1801. X!         char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
  1802. X          int dcount = 0;
  1803. X  
  1804. X          cp++;
  1805. X--- 98,104 ----
  1806. X      }
  1807. X      if (*cp == '\\' && index("0123456789xXoO", cp[1]))
  1808. X      {
  1809. X!         const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
  1810. X          int dcount = 0;
  1811. X  
  1812. X          cp++;
  1813. X***************
  1814. X*** 157,162 ****
  1815. X--- 158,164 ----
  1816. X  register char *opts;
  1817. X  boolean from_env;
  1818. X  {
  1819. X+ #ifndef MACOS
  1820. X      register char *op;
  1821. X      unsigned num;
  1822. X      boolean negated;
  1823. X***************
  1824. X*** 476,481 ****
  1825. X--- 478,486 ----
  1826. X          return;
  1827. X      }
  1828. X  #ifdef MSDOS
  1829. X+ # ifdef AMIGA_WBENCH
  1830. X+     if(ami_wbench_badopt(opts))
  1831. X+ # endif
  1832. X      Printf("Bad syntax in OPTIONS in %s: %s.", configfile, opts);
  1833. X  #else
  1834. X      Printf("Bad syntax in NETHACKOPTIONS: %s.", opts);
  1835. X***************
  1836. X*** 485,495 ****
  1837. X--- 490,797 ----
  1838. X      );
  1839. X  #endif
  1840. X      getret();
  1841. X+ #endif /* MACOS */
  1842. X  }
  1843. X  
  1844. X  int
  1845. X  doset()
  1846. X  {
  1847. X+ #ifdef MACOS
  1848. X+ #define    OPTIONS            "Nethack prefs"
  1849. X+ #define OK_BUTTON 1
  1850. X+ #define SAVE_BUTTON 2
  1851. X+ #define CANCEL_BUTTON 3
  1852. X+ #define MIN_CHECKBOX 4
  1853. X+ #define EXPLORE_BOX 4
  1854. X+ #define FEM_BOX 5
  1855. X+ #define NEWS_BOX 6
  1856. X+ #define FIXINV_BOX 7
  1857. X+ #define TOMB_BOX 8
  1858. X+ #define TIME_BOX 9
  1859. X+ #define VERBOSE_BOX 10
  1860. X+ #define SILENT_BOX 11
  1861. X+ #define AUTOZOOM_BOX 12
  1862. X+ #define INVERSE_BOX 13
  1863. X+ #define SORT_BOX 14
  1864. X+ #define COLOR_BOX 15
  1865. X+ #define PICKUP_BOX 16
  1866. X+ #define CONFIRM_BOX 17
  1867. X+ #define SAFE_BOX 18
  1868. X+ #define REST_SPACE_BOX 19
  1869. X+ #define MAX_CHECKBOX 19
  1870. X+ #define PLAYER_NAME 20
  1871. X+ #define CAT_NAME 21
  1872. X+ #define DOG_NAME 22
  1873. X+ #define FRUIT_NAME 23
  1874. X+ #define PACKORDER 24
  1875. X+ #define END_TOP 26
  1876. X+ #define END_AROUND 27
  1877. X+ #define FRUIT_TEXT 35
  1878. X+ #define PACK_TEXT 34
  1879. X+ #define ITEMTEXT(item,text) {GetDItem(optionDlg,item,&type,&ItemHndl,&box); \
  1880. X+                              (void)CtoPstr(text); \
  1881. X+                              SetIText(ItemHndl,text);\
  1882. X+                              (void)PtoCstr(text);}
  1883. X+ #define HIDEITEM(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box); \
  1884. X+                         HideControl(ItemHndl);\
  1885. X+                         SetDItem(optionDlg,item,type+128,ItemHndl,&box);}
  1886. X+ #define HIDETEXT(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
  1887. X+                         SetDItem(optionDlg,item,128+statText,ItemHndl,&box);\
  1888. X+                         SetIText(ItemHndl,"\0");}
  1889. X+ #define SHOWITEM(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
  1890. X+                         SetDItem(optionDlg,item,type-128,ItemHndl,&box);\
  1891. X+                         ShowControl(ItemHndl);}
  1892. X+ #define GETTEXT(item,maxsize) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
  1893. X+                     GetIText (ItemHndl, &tmp_name);\
  1894. X+                     tmp_name[tmp_name[0]+1] = 0;\
  1895. X+                     if (tmp_name[0] > maxsize)\
  1896. X+                         tmp_name[0] = maxsize;}
  1897. X+     static boolean *flag_ptrs[20] = {0, 0, 0, 0, &flags.explore,
  1898. X+             &flags.female, &flags.nonews,&flags.invlet_constant,
  1899. X+             &flags.notombstone, &flags.time, &flags.verbose,
  1900. X+             &flags.silent, 0, &flags.standout, &flags.sortpack,
  1901. X+ #ifdef TEXTCOLOR
  1902. X+             &flags.use_color,
  1903. X+ #else
  1904. X+             0,
  1905. X+ #endif
  1906. X+             &flags.pickup, &flags.confirm,
  1907. X+             &flags.safe_dog, &flags.no_rest_on_space};
  1908. X+     extern short macflags;
  1909. X+     short dlgItem, type;
  1910. X+     Rect box;
  1911. X+     extern WindowPtr    HackWindow;
  1912. X+     Handle ItemHndl;
  1913. X+     unsigned num;
  1914. X+     char *op;
  1915. X+     char tmp_name[256];
  1916. X+     char savename[PL_NSIZ];
  1917. X+     char savedog[63];
  1918. X+     char savecat[63];
  1919. X+     char savefruit[PL_FSIZ];
  1920. X+     char saveorder[20];
  1921. X+     DialogRecord    dlgR;
  1922. X+     DialogPtr optionDlg;
  1923. X+     DialogTHndl    th, centreDlgBox();
  1924. X+     boolean done = FALSE;
  1925. X+     short savemacflags = macflags;
  1926. X+     struct flag saveflags;
  1927. X+     register char    *sp, *tmp;
  1928. X+ 
  1929. X+     SetCursor(&ARROW_CURSOR);
  1930. X+ 
  1931. X+     BlockMove(&flags, &saveflags, sizeof(struct flag));
  1932. X+     
  1933. X+     th = centreDlgBox(130, FALSE);
  1934. X+ 
  1935. X+     optionDlg = GetNewDialog(130, (Ptr)&dlgR, (WindowPtr)-1);
  1936. X+ /* set initial values of text items */
  1937. X+     nmcpy(savename,plname,sizeof(plname)-1);
  1938. X+     ITEMTEXT(PLAYER_NAME,plname);
  1939. X+     if(*dogname){
  1940. X+         nmcpy(savedog,dogname,62);
  1941. X+         ITEMTEXT(DOG_NAME,dogname);
  1942. X+     }
  1943. X+     if(*catname){
  1944. X+         nmcpy(savecat,catname,62);
  1945. X+         ITEMTEXT(CAT_NAME,catname);
  1946. X+     }
  1947. X+ #ifdef TUTTI_FRUTTI
  1948. X+     if(*pl_fruit){
  1949. X+         nmcpy(savefruit,pl_fruit,PL_FSIZ);
  1950. X+         ITEMTEXT(FRUIT_NAME,pl_fruit);
  1951. X+     }
  1952. X+ #else
  1953. X+     HIDETEXT(FRUIT_NAME);
  1954. X+     HIDETEXT(FRUIT_TEXT);
  1955. X+ #endif
  1956. X+     nmcpy(saveorder,inv_order,strlen(inv_order)+1);
  1957. X+     ITEMTEXT(PACKORDER,inv_order);
  1958. X+ /* set initial values of record items */
  1959. X+     Sprintf(tmp_name,"%u",flags.end_top);
  1960. X+     ITEMTEXT(END_TOP,tmp_name);
  1961. X+     Sprintf(tmp_name,"%u",flags.end_around);
  1962. X+     ITEMTEXT(END_AROUND,tmp_name);
  1963. X+ /* set initial values of checkboxes */
  1964. X+     for(dlgItem = MIN_CHECKBOX; dlgItem <= MAX_CHECKBOX; dlgItem++) {
  1965. X+         GetDItem(optionDlg, dlgItem, &type, &ItemHndl, &box);
  1966. X+         switch (dlgItem){
  1967. X+             case NEWS_BOX:
  1968. X+ #ifndef NEWS
  1969. X+                 HIDEITEM(NEWS_BOX);
  1970. X+                 break;
  1971. X+ #endif
  1972. X+             case TOMB_BOX:
  1973. X+             case REST_SPACE_BOX:
  1974. X+                 SetCtlValue(ItemHndl,!(*(flag_ptrs[dlgItem])));
  1975. X+                 break;
  1976. X+             case AUTOZOOM_BOX:
  1977. X+                 SetCtlValue(ItemHndl,macflags & fZoomOnContextSwitch);
  1978. X+                 break;
  1979. X+ #ifndef TEXTCOLOR
  1980. X+             case COLOR_BOX:
  1981. X+                 HIDEITEM(COLOR_BOX);
  1982. X+                 break;
  1983. X+ #endif
  1984. X+             default:
  1985. X+                 SetCtlValue(ItemHndl,*(flag_ptrs[dlgItem]));
  1986. X+         }
  1987. X+     }
  1988. X+     SelIText(optionDlg, PLAYER_NAME, 0, 32767);
  1989. X+     
  1990. X+     ShowWindow(optionDlg);
  1991. X+     GetDItem(optionDlg, OK, &type, &ItemHndl, &box);
  1992. X+     SetPort (optionDlg);
  1993. X+     PenSize(3, 3);
  1994. X+     InsetRect (&box, -4, -4);
  1995. X+     FrameRoundRect (&box, 16, 16);
  1996. X+     
  1997. X+     while(!done) {
  1998. X+         ModalDialog((ProcPtr)0, &dlgItem);
  1999. X+         GetDItem(optionDlg, dlgItem, &type, &ItemHndl, &box);
  2000. X+         if (dlgItem >= MIN_CHECKBOX && dlgItem <= MAX_CHECKBOX) {
  2001. X+             SetCtlValue(ItemHndl, ! GetCtlValue (ItemHndl));
  2002. X+             if (dlgItem != AUTOZOOM_BOX)
  2003. X+                 *(flag_ptrs[dlgItem]) = !*(flag_ptrs[dlgItem]);
  2004. X+             else
  2005. X+                 macflags ^= fZoomOnContextSwitch;
  2006. X+         }
  2007. X+         else switch(dlgItem){
  2008. X+             case SAVE_BUTTON:
  2009. X+                 GETTEXT(PLAYER_NAME,PL_NSIZ-1);
  2010. X+                 strncpy(plname, tmp_name, tmp_name[0]+1);
  2011. X+                 (void)PtoCstr (plname);
  2012. X+             
  2013. X+                 GETTEXT(DOG_NAME,62);
  2014. X+                 strncpy(dogname, tmp_name, tmp_name[0]+1);
  2015. X+                 (void)PtoCstr (dogname);
  2016. X+             
  2017. X+                 GETTEXT(CAT_NAME,62);
  2018. X+                 strncpy(catname, tmp_name, tmp_name[0]+1);
  2019. X+                 (void)PtoCstr (catname);
  2020. X+ 
  2021. X+ #ifdef TUTTI_FRUTTI
  2022. X+                 GETTEXT(FRUIT_NAME,PL_FSIZ-1);
  2023. X+                 strncpy(pl_fruit, tmp_name, tmp_name[0]+1);
  2024. X+                 (void)PtoCstr (pl_fruit);
  2025. X+ #endif
  2026. X+ 
  2027. X+                 GETTEXT(PACKORDER,19);
  2028. X+                 op = tmp_name+1;
  2029. X+                 /* Missing characters in new order are filled in at the end 
  2030. X+                  * from inv_order.
  2031. X+                  */
  2032. X+                 for (sp = op; *sp; sp++)
  2033. X+                     if ((!index(inv_order, *sp))||(index(sp+1, *sp))){
  2034. X+                         for(tmp = sp; *tmp;tmp++)
  2035. X+                             tmp[0]=tmp[1];
  2036. X+                         sp--;
  2037. X+                     }            /* bad or duplicate char in order - remove it*/
  2038. X+                 tmp = (char *) alloc((unsigned)(strlen(inv_order)+1));
  2039. X+                 Strcpy(tmp, op);
  2040. X+                 for (sp = inv_order, num = strlen(tmp); *sp; sp++)
  2041. X+                     if (!index(tmp, *sp)) {
  2042. X+                         tmp[num++] = *sp;
  2043. X+                         tmp[num] = 0;
  2044. X+                     }
  2045. X+                 Strcpy(inv_order, tmp);
  2046. X+                 free((genericptr_t)tmp);
  2047. X+ 
  2048. X+                 GETTEXT(END_TOP,5);
  2049. X+                 op = tmp_name+1;
  2050. X+                 while(*op) {
  2051. X+                     num = 1;
  2052. X+                     if(digit(*op)) {
  2053. X+                         num = atoi(op);
  2054. X+                         while(digit(*op)) op++;
  2055. X+                     } else op++;
  2056. X+                 }
  2057. X+                 flags.end_top=num;
  2058. X+                 GETTEXT(END_AROUND,5);
  2059. X+                 op = tmp_name+1;
  2060. X+                 while(*op) {
  2061. X+                     num = 1;
  2062. X+                     if(digit(*op)) {
  2063. X+                         num = atoi(op);
  2064. X+                         while(digit(*op)) op++;
  2065. X+                     } else op++;
  2066. X+                 }
  2067. X+                 flags.end_around = num;
  2068. X+                 write_opts();
  2069. X+                 nmcpy(dogname,savedog,62);
  2070. X+                 nmcpy(catname,savecat,62);
  2071. X+                 nmcpy(plname,savename,sizeof(plname)-1);
  2072. X+ #ifdef TUTTI_FRUTTI
  2073. X+                 nmcpy(pl_fruit,savefruit,PL_FSIZ-1);
  2074. X+ #endif
  2075. X+                 nmcpy(inv_order,saveorder,strlen(inv_order)+1);
  2076. X+             case CANCEL_BUTTON:
  2077. X+                 flags = saveflags;
  2078. X+                 macflags = savemacflags;
  2079. X+                 done = TRUE;
  2080. X+                 break;
  2081. X+             case OK_BUTTON:
  2082. X+                 GETTEXT(END_TOP,5);
  2083. X+                 op = tmp_name+1;
  2084. X+                 while(*op) {
  2085. X+                     num = 1;
  2086. X+                     if(digit(*op)) {
  2087. X+                         num = atoi(op);
  2088. X+                         while(digit(*op)) op++;
  2089. X+                     } else op++;
  2090. X+                 }
  2091. X+                 flags.end_top=num;
  2092. X+                 GETTEXT(END_AROUND,5);
  2093. X+                 op = tmp_name+1;
  2094. X+                 while(*op) {
  2095. X+                     num = 1;
  2096. X+                     if(digit(*op)) {
  2097. X+                         num = atoi(op);
  2098. X+                         while(digit(*op)) op++;
  2099. X+                     } else op++;
  2100. X+                 }
  2101. X+                 flags.end_around = num;
  2102. X+ #ifdef TUTTI_FRUTTI
  2103. X+                 GETTEXT(FRUIT_NAME,PL_FSIZ-1);
  2104. X+                 (void)PtoCstr (tmp_name);
  2105. X+                 (void)fruitadd(tmp_name);
  2106. X+                 nmcpy(pl_fruit,tmp_name,PL_FSIZ-1);
  2107. X+ #endif
  2108. X+                 nmcpy(dogname,savedog,62);
  2109. X+                 nmcpy(catname,savecat,62);
  2110. X+                 nmcpy(plname,savename,sizeof(plname)-1);
  2111. X+                 GETTEXT(PACKORDER,19);
  2112. X+                 op = tmp_name+1;
  2113. X+                 /* Missing characters in new order are filled in at the end 
  2114. X+                  * from inv_order.
  2115. X+                  */
  2116. X+                 for (sp = op; *sp; sp++)
  2117. X+                     if ((!index(inv_order, *sp))||(index(sp+1, *sp))){
  2118. X+                         for (tmp = sp; *tmp;tmp++)
  2119. X+                             tmp[0]=tmp[1];
  2120. X+                         sp--;
  2121. X+                     }            /* bad or duplicate char in order - remove it*/
  2122. X+                 tmp = (char *) alloc((unsigned)(strlen(inv_order)+1));
  2123. X+                 Strcpy(tmp, op);
  2124. X+                 for (sp = inv_order, num = strlen(tmp); *sp; sp++)
  2125. X+                     if (!index(tmp, *sp)) {
  2126. X+                         tmp[num++] = *sp;
  2127. X+                         tmp[num] = 0;
  2128. X+                     }
  2129. X+                 Strcpy(inv_order, tmp);
  2130. X+                 free((genericptr_t)tmp);
  2131. X+                 flags.female = saveflags.female;
  2132. X+                 flags.explore = saveflags.explore;
  2133. X+                 done = TRUE;
  2134. X+                 break;
  2135. X+             default:;
  2136. X+         }
  2137. X+     } 
  2138. X+     HideWindow(optionDlg);
  2139. X+     DisposDialog (optionDlg);
  2140. X+     SetPort (HackWindow);
  2141. X+     return 0; 
  2142. X+ #else
  2143. X      char buf[BUFSZ];
  2144. X  
  2145. X      pline("What options do you want to set? ");
  2146. X***************
  2147. X*** 536,542 ****
  2148. X  #ifdef TUTTI_FRUTTI
  2149. X          Sprintf(eos(buf), "fruit:%s,", pl_fruit);
  2150. X  #endif
  2151. X!         if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){
  2152. X          Sprintf(eos(buf), "endgame: %u top scores/%u around me",
  2153. X              flags.end_top, flags.end_around);
  2154. X          if(flags.end_own) Strcat(buf, "/own scores");
  2155. X--- 838,844 ----
  2156. X  #ifdef TUTTI_FRUTTI
  2157. X          Sprintf(eos(buf), "fruit:%s,", pl_fruit);
  2158. X  #endif
  2159. X!         if(flags.end_top != 3 || flags.end_around != 2 || flags.end_own){
  2160. X          Sprintf(eos(buf), "endgame: %u top scores/%u around me",
  2161. X              flags.end_top, flags.end_around);
  2162. X          if(flags.end_own) Strcat(buf, "/own scores");
  2163. X***************
  2164. X*** 551,556 ****
  2165. X--- 853,859 ----
  2166. X      }
  2167. X  
  2168. X      return 0;
  2169. X+ #endif /* MACOS */
  2170. X  }
  2171. X  
  2172. X  int
  2173. X***************
  2174. X*** 637,642 ****
  2175. X--- 940,946 ----
  2176. X      set_pager(1);
  2177. X      return;
  2178. X  quit:
  2179. X+     (void) next_opt("\033");
  2180. X      set_pager(2);
  2181. X      return;
  2182. X  }
  2183. X***************
  2184. X*** 643,660 ****
  2185. X  
  2186. X  /*
  2187. X   * prints the next boolean option, on the same line if possible, on a new
  2188. X!  * line if not
  2189. X   */
  2190. X! static int
  2191. X  next_opt(str)
  2192. X!     char *str;
  2193. X  {
  2194. X!     static char buf[80];
  2195. X      static int i = 0;
  2196. X      int r = 0;
  2197. X  
  2198. X      i += strlen(str);
  2199. X!     if (i > (CO - 2) || !*str) {
  2200. X          r = page_line(buf);
  2201. X          buf[0] = 0;
  2202. X          i = strlen(str);
  2203. X--- 947,968 ----
  2204. X  
  2205. X  /*
  2206. X   * prints the next boolean option, on the same line if possible, on a new
  2207. X!  * line if not. End with next_opt(""). Note that next_opt("\033") may be
  2208. X!  * used to abort.
  2209. X   */
  2210. X! int
  2211. X  next_opt(str)
  2212. X! const char *str;
  2213. X  {
  2214. X!     static char buf[121];
  2215. X      static int i = 0;
  2216. X      int r = 0;
  2217. X  
  2218. X+     if (*str == '\033') {
  2219. X+         i = 0; buf[0] = 0; return 0;
  2220. X+     }
  2221. X      i += strlen(str);
  2222. X!     if (i > min(CO - 2, 120) || !*str) {
  2223. X          r = page_line(buf);
  2224. X          buf[0] = 0;
  2225. X          i = strlen(str);
  2226. X***************
  2227. X*** 677,683 ****
  2228. X--- 985,995 ----
  2229. X  {
  2230. X      register int i,j;
  2231. X      register struct fruit *f;
  2232. X+ #ifdef __GNULINT__
  2233. X+     struct fruit *lastf = 0;
  2234. X+ #else
  2235. X      struct fruit *lastf;
  2236. X+ #endif
  2237. X      int highest_fruit_id = 0;
  2238. X      char buf[PL_FSIZ];
  2239. X      boolean user_specified = (str == pl_fruit);
  2240. X*** src/Old/track.c    Mon Feb 19 19:03:41 1990
  2241. X--- src/track.c    Fri Feb 16 19:14:36 1990
  2242. X***************
  2243. X*** 7,21 ****
  2244. X  
  2245. X  #define    UTSZ    50
  2246. X  
  2247. X! coord utrack[UTSZ];
  2248. X! int utcnt = 0;
  2249. X! int utpnt = 0;
  2250. X  
  2251. X  void
  2252. X  initrack(){
  2253. X      utcnt = utpnt = 0;
  2254. X  }
  2255. X  
  2256. X  /* add to track */
  2257. X  void
  2258. X  settrack(){
  2259. X--- 7,24 ----
  2260. X  
  2261. X  #define    UTSZ    50
  2262. X  
  2263. X! VSTATIC int utcnt, utpnt;
  2264. X! VSTATIC coord utrack[UTSZ];
  2265. X  
  2266. X+ #ifdef OVLB
  2267. X  void
  2268. X  initrack(){
  2269. X      utcnt = utpnt = 0;
  2270. X  }
  2271. X+ #endif /* OVLB */
  2272. X  
  2273. X+ #ifdef OVL1
  2274. X+ 
  2275. X  /* add to track */
  2276. X  void
  2277. X  settrack(){
  2278. X***************
  2279. X*** 26,31 ****
  2280. X--- 29,37 ----
  2281. X      utpnt++;
  2282. X  }
  2283. X  
  2284. X+ #endif /* OVL1 */
  2285. X+ #ifdef OVL0
  2286. X+ 
  2287. X  coord *
  2288. X  gettrack(x, y)
  2289. X  register int x, y;
  2290. X***************
  2291. X*** 42,44 ****
  2292. X--- 48,52 ----
  2293. X      }
  2294. X      return (coord *)0;
  2295. X  }
  2296. X+ 
  2297. X+ #endif /* OVL0 */
  2298. X
  2299. END_OF_FILE
  2300. if test 52317 -ne `wc -c <'patch7.18'`; then
  2301.     echo shar: \"'patch7.18'\" unpacked with wrong size!
  2302. fi
  2303. # end of 'patch7.18'
  2304. echo shar: End of archive 22 \(of 30\).
  2305. cp /dev/null ark22isdone
  2306. MISSING=""
  2307. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
  2308.     if test ! -f ark${I}isdone ; then
  2309.     MISSING="${MISSING} ${I}"
  2310.     fi
  2311. done
  2312. if test "${MISSING}" = "" ; then
  2313.     echo You have unpacked all 30 archives.
  2314.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2315. else
  2316.     echo You still need to unpack the following archives:
  2317.     echo "        " ${MISSING}
  2318. fi
  2319. ##  End of shell archive.
  2320. exit 0
  2321.